package com.jack.payment.util.auth;

import com.jack.payment.entity.generate.config.ConfigEmailModel;
import com.jack.payment.entity.generate.config.ConfigPayAliModel;
import com.jack.payment.entity.generate.config.ConfigPayStripeModel;
import com.jack.payment.entity.generate.config.ConfigPayWechatModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class DataAuthUtils {
    private Logger log = LoggerFactory.getLogger(DataAuthUtils.class);

    /**
     * 解密支付宝 配置数据信息
     * @param configPayAli 需要解密的支付宝配置数据
     * @return
     */
    public ConfigPayAliModel decodeConfigAliPay(ConfigPayAliModel configPayAli) {
        try {
            configPayAli.setPrivateKey(AuthUtils.aesDecrypt(configPayAli.getPrivateKey()));
            configPayAli.setAppId(AuthUtils.aesDecrypt(configPayAli.getAppId()));
            // 判断是证书 模式 还是 密钥模式
            if (configPayAli.getType() == 1) {
                log.info("支付宝目前的配置模式是密钥模式");
                configPayAli.setAlipayPublicKey(AuthUtils.aesDecrypt(configPayAli.getAlipayPublicKey()));
            } else if (configPayAli.getType() == 2){
                log.info("支付宝目前配置模式是证书模式");
                configPayAli.setRootCertContent(AuthUtils.aesDecrypt(configPayAli.getRootCertContent()));
                configPayAli.setAlipayPublicCertContent(AuthUtils.aesDecrypt(configPayAli.getAlipayPublicCertContent()));
                configPayAli.setAppCertContent(AuthUtils.aesDecrypt(configPayAli.getAppCertContent()));
            }
            return configPayAli;
        } catch (Exception e) {
            log.error("严重错误!!! 支付宝解密失败!!! 这可能导致支付宝支付无法使用!!!");
            log.error("详细错误如下: {}", e);
            return null;
        }
    }

    /**
     * 加密支付宝配置信息
     * @param configPayAli
     * @return
     */
    public ConfigPayAliModel encryptConfigAliPay(ConfigPayAliModel configPayAli) {
        if (configPayAli != null) {
            configPayAli.setPrivateKey(AuthUtils.aesEncrypt(configPayAli.getPrivateKey()));
            configPayAli.setAppId(AuthUtils.aesEncrypt(configPayAli.getAppId()));
            // 判断是证书 模式 还是 密钥模式
            if (configPayAli.getType() == 1) {
                configPayAli.setAlipayPublicKey(AuthUtils.aesEncrypt(configPayAli.getAlipayPublicKey()));
            } else if (configPayAli.getType() == 2){
                configPayAli.setRootCertContent(AuthUtils.aesEncrypt(configPayAli.getRootCertContent()));
                configPayAli.setAlipayPublicCertContent(AuthUtils.aesEncrypt(configPayAli.getAlipayPublicCertContent()));
                configPayAli.setAppCertContent(AuthUtils.aesEncrypt(configPayAli.getAppCertContent()));
            }
            return configPayAli;
        }
        return null;
    }

    /**
     * 解密 stripe 支付信息
     * @param configPayStripeModel
     * @return
     */
    public ConfigPayStripeModel decodeConfigStripe(ConfigPayStripeModel configPayStripeModel) {
        if (configPayStripeModel != null) {
            configPayStripeModel.setPkKey(AuthUtils.aesDecrypt(configPayStripeModel.getPkKey()));
            configPayStripeModel.setSkKey(AuthUtils.aesDecrypt(configPayStripeModel.getSkKey()));
            return configPayStripeModel;
        }
        log.info("stripe 配置解密失败!!!!!");
        return null;
    }

    /**
     * 加密stripe 支付信息
     * @param configPayStripeModel
     * @return
     */
    public ConfigPayStripeModel encryptConfigStripe(ConfigPayStripeModel configPayStripeModel) {
        if (configPayStripeModel != null) {
            configPayStripeModel.setPkKey(AuthUtils.aesEncrypt(configPayStripeModel.getPkKey()));
            configPayStripeModel.setSkKey(AuthUtils.aesEncrypt(configPayStripeModel.getSkKey()));
            return configPayStripeModel;
        }
        log.info("stripe 解密失败!!!!!");
        return null;
    }

    /**
     *
     * @param configPayWechatModel
     * @return
     */
    public ConfigPayWechatModel decodeConfigWechat(ConfigPayWechatModel configPayWechatModel) {
        if (configPayWechatModel != null) {
            configPayWechatModel.setApiV3(AuthUtils.aesDecrypt(configPayWechatModel.getApiV3()));
            configPayWechatModel.setApplet(AuthUtils.aesDecrypt(configPayWechatModel.getApplet()));
            configPayWechatModel.setMchSerialNo(AuthUtils.aesDecrypt(configPayWechatModel.getMchSerialNo()));
            configPayWechatModel.setProveBook(AuthUtils.aesDecrypt(configPayWechatModel.getProveBook()));
            return configPayWechatModel;
        }
        log.info("wechat decode fail");
        return null;
    }

    /***
     *
     * @param configPayWechatModel
     * @return
     */
    public ConfigPayWechatModel encryptConfigWechat(ConfigPayWechatModel configPayWechatModel) {
        if (configPayWechatModel != null) {
            configPayWechatModel.setApiV3(AuthUtils.aesEncrypt(configPayWechatModel.getApiV3()));
            configPayWechatModel.setApplet(AuthUtils.aesEncrypt(configPayWechatModel.getApplet()));
            configPayWechatModel.setMchSerialNo(AuthUtils.aesEncrypt(configPayWechatModel.getMchSerialNo()));
            configPayWechatModel.setProveBook(AuthUtils.aesEncrypt(configPayWechatModel.getProveBook()));
            return configPayWechatModel;
        }
        log.info("wechat encrypt fail");
        return null;
    }

    /**
     * 解密邮箱配置 数据
     * @param configEmailModel
     * @return
     */
    public ConfigEmailModel decodeConfigEmail(ConfigEmailModel configEmailModel) {
        configEmailModel.setHost(AuthUtils.aesDecrypt(configEmailModel.getHost()));
        configEmailModel.setAccount(AuthUtils.aesDecrypt(configEmailModel.getAccount()));
        configEmailModel.setPassword(AuthUtils.aesDecrypt(configEmailModel.getPassword()));
        return configEmailModel;
    }

    /**
     * 加密 邮箱配置数据
     * @param configEmailModel
     * @return
     */
    public ConfigEmailModel encryptConfigEmail(ConfigEmailModel configEmailModel) {
        configEmailModel.setHost(AuthUtils.aesEncrypt(configEmailModel.getHost()));
        configEmailModel.setAccount(AuthUtils.aesEncrypt(configEmailModel.getAccount()));
        configEmailModel.setPassword(AuthUtils.aesEncrypt(configEmailModel.getPassword()));
        return configEmailModel;
    }

}
